﻿using System;
using MyGame;
using MyGame2;
using MyGame.GameLogic;
using MyGame.UI;
#region 一 命名空间基本概念
//概念
//命名空间是用来组织和重用代码的
//作用
//就像是一个工具包 类就像是一件一件的工具 申明在命名空间中
#endregion

#region 二 命名空间的使用
//基本语法
//namespace 命名空间名
//{
//  类
//  类
//}
namespace MyGame
{
    class GameObject
    {

    }
    
}
//命名空间可以分开申明 类似于分部类
namespace MyGame
{
    //两个命名空间是同一个 可以直接继承
    class Player : GameObject
    {

    }
}
#endregion

#region 四 不同命名空间中允许有同名类
//若不同命名空间中含有同名类 那么使用类时必须指明出处
namespace MyGame2
{
    class GameObject
    {
        //不同类中也允许有同名方法
    }
}
#endregion

#region 五 命名空间可以包裹命名空间
namespace MyGame
{
    namespace UI
    {
        //若仅引用MyGame 不能使用UI 要使用UI 需要引用MyGame.UI
        class Image
        {

        }
    }
    namespace GameLogic
    {
        class Image
        {

        }
    }
}
#endregion

#region 六 关于修饰类的访问修饰符
//修饰类的关键字
//public   - 公共的
//internal - 只能在该程序集中使用 类默认为internal
//abstract - 抽象类
//sealed   - 密封类
//partial  - 分部类
#endregion

namespace Lesson21_命名空间
{
    class Program
    {
        static void Main(string[] args)
        {
            #region 三 不同命名空间中相互使用 需要引用命名空间或指明出处
            //1.引用命名空间 using 命名空间名

            //2.指明出处 命名空间名.命名空间成员
            //若不同命名空间中含有同名类 那么使用类时必须指明出处
            MyGame.GameObject game1 = new MyGame.GameObject();
            MyGame2.GameObject game2 = new MyGame2.GameObject();
            MyGame.UI.Image image1 = new MyGame.UI.Image();
            #endregion
        }
    }
}

//总结
//1.命名空间可以理解成工具包 用来管理类
//2.不同命名空间中 可以有同名类
//3.不同命名空间中相互使用 需要using引用命名空间 或者 指明出处
//4.命名空间可以包裹命名空间 使用包裹的命名空间需要按层级依次引用或点出